package FlyBirdGame;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;//实现类，将一幅图片加载到内存中
import java.io.File;

class Bird {
    //图片
    BufferedImage image;
    //位置
    int x,y;
    //宽，高
    int width,height;
    //大小
    int size;//----------------------------

    //重力加速度
    double g;
    //位移的间隔时间
    double t;
    //最初上抛速度
    double v0;
    //当前上抛速度
    double speed;
    //经过时间t后的位移
    double s;
    //小鸟的倾角
    double beta;

    //一组图片，记录小鸟的动画帧
    static BufferedImage[] images;
    //动画帧数组的下标
    int index;

    //初始化小鸟
    public  Bird() throws Exception{
        //初始化基本参数，参数都是借用已有的

    	String path = "img/bird_image/";//指出路径具体位置！没有这条游戏无法运行
        image = ImageIO.read(new File(path,"1.png"));
        width = image.getWidth();
        height = image.getHeight();
        x=132;
        y=280;
        size =40;

        //初始化位移参数
        g=4;
        v0=20;
        t=0.25;
        speed = v0;
        s = 0;
        beta = 0;

        //初始化动画帧参数
        images = new BufferedImage[3];//加载7张小鸟姿态
        for(int i = 1;i<=3;i++){//如果i=0鸟儿就会闪烁不止
            images[i-1] = ImageIO.read(new File(path,i+".png"));
        }
        index = 0;
    }

    //飞行动作（变化一帧）
    public void fly(){
        index++;
        image = images[(index/35)%3];//控制飞行姿态变化速度
        
    }

    //移动一步
    public void step(){
        double v0 =speed;
        //计算上抛运动位移
        s=v0*t + g*t*t/2;//物理学位移公式
        //计算小鸟的坐标位置
        y=y-(int)s;//y是int型，s是double型，向下强转
        //计算下次移动速度
        double v = v0 -g*t;
        speed = v;
        //计算倾角
        beta = Math.atan(s/8);
    }

    //向上飞翔
    public void flappy(){
        //重叠速度
        speed =v0;//每次点击提供小鸟一个同等的向上初速度
    }

    //检查小鸟是否碰撞到地面
    public boolean hit(Ground ground ){
        boolean hit = y+size/2 > ground.y;//鸟的底边碰地  边界
        if(hit){
            y = ground.y - size/2;
            beta = -3.14159265358979323 / 2;
        }
        return hit;
    }

    //检查小鸟是否碰到柱子
    public boolean hit(Column column){//--------------------------
        //先检测是否在柱子范围内
        if(x>column.x - column.width /2 - size /2
            && x<column.x + column.width/2 + size/2){
            //检查是否在柱子的缝隙中
            if(y>column.y - column.gap/2 + size /2
            && y<column.y + column.gap /2 -size/2){
                return false;
            }
            return true;
        }
        return false;
    }
}
